#include <iostream>
#include <cstdio>
using namespace std;

double liczba_a, liczba_b, liczba_c, wynik;


/*------------------------------------------------Deklaracje funkcji---------------------------------------------*/
void spis_tresci();
void dodaj();
void odejmij();
void pomnoz();
void podziel();
void kwadrat();
void pierwiastek_kwadratowy();
void potegowanie();
void pierwiastkowanie();
void reszta_z_dzielenia();
void postac_og_na_kan();
void postac_og_na_ilo();
void postac_kan_na_og();
void postac_kan_na_ilo();
void postac_ilo_na_og();
void postac_ilo_na_kan();
/*----------------------------------------------------------------------------------------------------------------*/



int main()
{
	while (true)
	{
		int numer_dzialania;
		spis_tresci();
		cout << "Wybierz dzialanie:";
		cin >> numer_dzialania;
		cin.clear();
		cin.sync();
		system("cls");
		switch (numer_dzialania)
		{
		case 1:
			dodaj();
			break;
		case 2:
			odejmij();
			break;
		case 3:
			pomnoz();
			break;
		case 4:
			podziel();
			break;
		case 5:
			kwadrat();
			break;
		case 6:
			pierwiastek_kwadratowy();
			break;
		case 7:
			potegowanie();
			break;
		case 8:
			pierwiastkowanie();
			break;
		case 9:
			reszta_z_dzielenia();
			break;
		case 10:
			postac_og_na_kan();
			break;
		case 11:
			postac_og_na_ilo();
			break;
		case 12:
			postac_kan_na_og();
			break;
		case 13:
			postac_kan_na_ilo();
			break;
		case 14:
			postac_ilo_na_og();
			break;
		case 15:
			postac_ilo_na_kan();
			break;
		}
		cin.sync();
		cin.get();
	}
}


void spis_tresci()
{
	cout << " \t KALKULATOR" << endl << endl << endl;
	cout << "[1]Dodawanie." << endl;
	cout << "[2]Odejmowanie." << endl;
	cout << "[3]Mnozenie." << endl;
	cout << "[4]Dzielenie." << endl;
	cout << "[5]Potega kwadratowa." << endl;
	cout << "[6]Pierwiastek kwadratowy." << endl;
	cout << "[7]Potegowanie." << endl;
	cout << "[8]Inne pierwiastki." << endl;
	cout << "[9]Rszta z dzielenia." << endl << endl << endl;
	cout << "Przeksztalcanie wzorow funkcji." << endl;
	cout << "[10]Postac ogolna na kanoniczna." << endl;
	cout << "[11]Postac ogolna na iloczynowa." << endl;
	cout << "[12]Postac kanoniczna na ogolna." << endl;
	cout << "[13]Postac kanoniczna na iloczynowa." << endl;
	cout << "[14]Postac iloczynowa na ogolna." << endl;
	cout << "[15]Postac iloczynowa na kanoniczna." << endl << endl << endl;
}
void dodaj()
{
	cout << "[1]Dodawanie." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Podaj liczbe b:";
	cin >> liczba_b;
	wynik = liczba_a + liczba_b;
		cout << "Wynik:" << wynik;
}
void odejmij()
{
	cout << "[2]Odejmowanie." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Podaj liczbe b:";
	cin >> liczba_b;
	wynik = liczba_a - liczba_b;
	cout << "Wynik:" << wynik;
}
void pomnoz()
{
	cout << "[3]Mnozenie." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Podaj liczbe b:";
	cin >> liczba_b;
	cout << "Wynik:" << liczba_a * liczba_b;
}
void podziel()
{
	cout << "[4]Dzielenie." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Podaj liczbe b:";
	cin >> liczba_b;
	cout << "Wynik:" << liczba_a / liczba_b;
}
void kwadrat()
{
	cout << "[5]Potega kwadratowa." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Wynik:" << liczba_a * liczba_a;
}
void pierwiastek_kwadratowy()
{
	cout << "[6]Pierwiastek kwadratowy." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Wynik:" << sqrt(liczba_a);
}
void potegowanie()
{
	cout << "[7]Potegowanie." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Podaj wykladnik potegowania:";
	cin >> liczba_b;
	if (liczba_b == 0)
	{
		cout << "Wynik to: 1." << endl;
	}
	double liczba = liczba_a;
	for (int i = 1; i < liczba_b ; i++)
	{
		liczba *= liczba_a;
	}
	cout << "Wynik:" << liczba << endl;
}
void pierwiastkowanie()
{
	cout << "[8]Inne pierwiastki." << endl;
	cout << "Podaj liczbe z pod pierwiastka:";
	cin >> liczba_a;
	cout << "Podaj stopien pierwiastka:";
	cin >> liczba_b;
	cout << "Wynik:" << exp(log(liczba_a) / liczba_b);
}
void reszta_z_dzielenia()
{
	int a, b;
	cout << "[9]Reszta z dzielenia." << endl;
	cout << "Podaj liczbe a:";
	cin >> liczba_a;
	cout << "Podaj liczbe b:";
	cin >> liczba_b;
	a = liczba_a;
	b = liczba_b;
	cout << "Wynik:" << a % b;
}
void postac_og_na_kan()
{
	double p;
	double q;
	cout << "[10]Postac ogolna na kanoniczna." << endl;
	cout << "f(x)=ax^2+bx+c" << endl;
	cout << "Podaj a:";
	cin >> liczba_a;
	cout << "Podaj b:";
	cin >> liczba_b;
	cout << "Podaj c:";
	cin >> liczba_c;
	p = (-liczba_b) / (2 * liczba_a);
	q = (-((liczba_b * liczba_b) - (4 * liczba_a * liczba_c))) / (4 * liczba_a);
	cout << liczba_a << "(x-" << p << ")^2+" << q;
}
void postac_og_na_ilo()
{
	cout << "[11]Postac ogolna na iloczynowa." << endl;
	double x1;
	double x2;
	double delta;
	cout << "f(x)=ax^2+bx+c" << endl;
	cout << "Podaj a:";
	cin >> liczba_a;
	cout << "Podaj b:";
	cin >> liczba_b;
	cout << "Podaj c:";
	cin >> liczba_c;
	delta = (liczba_b*liczba_b) - (4 * liczba_a * liczba_c);
	if (delta == 0) {
		x1 = (-liczba_b) / (2 * liczba_a);
		cout << "f(x)=" << liczba_a << "(x-" << x1 << ")^2";
	}
	else if (delta >= 0) {
		x1 = ((-liczba_b) - sqrt(delta)) / (2 * liczba_a);
		x2 = ((-liczba_b) + sqrt(delta)) / (2 * liczba_a);
		cout << "f(x)=" << liczba_a << "(x-" << x1 << ")(x-" << x2 << ")";
	}
	else if (delta < 0) cout << "Blad!!!";
}
void postac_kan_na_og()
{
	double p;
	double q;
	cout << "[12]Postac kanoniczna na ogolna." << endl;
	cout << "f(x)=a(x-p)^2+q" << endl;
	cout << "Podaj a:";
	cin >> liczba_a;
	cout << "Podaj p:";
	cin >> p;
	cout << "Podaj q:";
	cin >> q;
	liczba_b = (-2) * liczba_a * p;
	liczba_c = liczba_a * (p * p) + q;
	cout << "f(x)=" << liczba_a << "x^2+" << liczba_b << "x+" << liczba_c;
}
void postac_kan_na_ilo()
{
	cout << "[13]Postac kanoniczna na iloczynowa." << endl;
	float p;
	float q;
	float delta;
	float x1;
	float x2;
	cout << "f(x)=a(x-p)^2+q" << endl;
	cout << "Podaj a:";
	cin >> liczba_a;
	cout << "Podaj p:";
	cin >> p;
	cout << "Podaj q:";
	cin >> q;
	liczba_b = (-2) * liczba_a * p;
	liczba_c = liczba_a * (p * p) + q;
	delta = (liczba_b*liczba_b) - (4 * liczba_a * liczba_c);
	if (delta == 0) {
		x1 = (-liczba_b) / (2 * liczba_a);
		cout << "f(x)=" << liczba_a << "(x-" << x1 << ")^2";
	}
	else if (delta >= 0) {
		x1 = ((-liczba_b) - sqrt(delta)) / (2 * liczba_a);
		x2 = ((-liczba_b) + sqrt(delta)) / (2 * liczba_a);
		cout << "f(x)=" << liczba_a << "(x-" << x1 << ")(x-" << x2 << ")";
	}
	else if (delta < 0) cout << "Blad!!!";
}
void postac_ilo_na_og()
{
	cout << "[14]Postac iloczynowa na ogolna." << endl;
	cout << "f(x)=a(x-x1)(x-x2)" << endl;
	float x1;
	float x2;
	cout << "Podaj a:";
	cin >> liczba_a;
	cout << "Podaj x1:";
	cin >> x1;
	cout << "Podaj x2:";
	cin >> x2;
	liczba_b = -liczba_a * (x1 + x2);
	liczba_c = liczba_a * x1 * x2;
	cout << "f(x)=" << liczba_a << "x^2+" << liczba_b << "x+" << liczba_c;
}
void postac_ilo_na_kan()
{
	cout << "[15]Postac iloczynowa na kanoniczna." << endl;
	cout << "f(x)=a(x-x1)(x-x2)" << endl;
	float x1;
	float x2;
	float p;
	float q;
	float delta;
	cout << "Podaj a:";
	cin >> liczba_a;
	cout << "Podaj x1:";
	cin >> x1;
	cout << "Podaj x2:";
	cin >> x2;
	liczba_b = -liczba_a * (x1 + x2);
	liczba_c = liczba_a * x2 * x1;
	delta = (liczba_b * liczba_b) - (4 * liczba_a * liczba_c);
	p = -liczba_b / (2 * liczba_a);
	q = -delta / (4 * liczba_a);
	cout << "f(x)=" << liczba_a << "(x-" << p << ")^2+" << q;
}